<?php
    namespace Core\ORM\Attributs;
    /**
     * Cette classe sert à informer qu'un Attribut est une Foreign Key
     *
     * @author mpetrini
     */
    class Objet extends Attribut {
        /**
        * @var string $nomClasse
        */
        protected $nomClasse;
        /**
        * Constructeur complet
        * 
        * @param string $nomClasse
        * @param string $nom
        * @param boolean $primary (optional) (default=false)
        * @param int $taille (optional) (default=1)
        * 
        * @return void
        */
        public function __construct($nomClasse, $nom, $primary=false, $taille=11) {
            $this->nomClasse=$nomClasse;
            parent::__construct($nom, $primary, $taille);
            $this->type='int';
            $this->null=false;
        }
        /**
        * Permet de récupérer le nom de cet Attribut dans la Classe
        * 
        * @return string
        */
        public function getNomAttribut() {
            return strtolower($this->nomClasse);
        }
        /**
        * Permet le formalisme d'une valeur
        *
        * @param mixed
        * 
        * @return mixed 
        */
        public function getValeur($valeur) {
            return $valeur->getId();
        }
        /**
        * Retourne la chaine qui permet de déclarer 
        *
        * @return string
        */
        public function getChaineDeclaration() {
            return "new ".get_class($this)."(\"".$this->nomClasse."\", \"".$this->nom."\", ".var_export($this->primary, true).", \"".$this->taille."\")";
        }
        /**
        * Retourne le type documenté pour phpDocumentor
        * 
        * @return string
        */
        public function getTypeDocumente() {
            return "\Core\ORM\\".$this->nomClasse;
        }
        /**
        * Crée la ligne de déclaration dans une reqûete de BDD
        * 
        * @return string
        */
        public function creationDeclarationCreateTable() {
            $attributs = $this->getAttributDeclarationCreateTable();
            return $this->nom." ".strtoupper($this->type)."(".$this->taille.") ".$attributs["null"]." ".$attributs["defaut"]." ".$attributs["commentaires"];
        }
        /**
        * Permet de générer la ligne de déclaration de la clé étrangère
        * 
        * @param \Core\ORM\Generateur\Classes\Modele $from
        * 
        * @return string
        */
        public function creationDeclarationForeignKey($from) {
            return  "ALTER TABLE `".$from->getTable()."` ADD CONSTRAINT FK_".$from->getTable()."_".$this->nom.
                    " FOREIGN KEY (".$this->nom.") REFERENCES ". \Utils\Outils::fromCamelCase($this->nomClasse)." (id);";
        }
        
        //GETTERS ET SETTERS
        public function getNomClasse() {return $this->nomClasse;}
        public function setNomClasse($nomClasse) {$this->nomClasse=$nomClasse;}
    }
?>